AWS Step Functionsの実行完了をAWS Chatbotを使っていい感じにSlackに通知する
2022年10月15日頃からこの方法では正しく動作しません。
Incoming Webhookを使用してAWS Step Functionsの実行結果をSlackに通知するを参照してください。
こんにちは。サービスグループの武田です。
AWS ChatbotがAmazon EventBridgeイベントに対応したことで利用の幅が一気に広がりましたね。今回はその中からAWS Step Functionsの通知を試してみました。
ちなみに前回はAmazon ECRの通知を試しました。よければそちらもご覧ください。
まずは通知される内容を確認してみる
Chatbot、SNSトピックの設定は共通ですので、ちゃだいんのエントリを参考にしてください。
EventBridgeとSNSを連携されるイベントパターンは次のように定義しました。明示的に省いているのはRUNNING
です。実行スタート時にも通知したいのであれば、detail
を省略すればすべてのステータス変更が対象となります。
{ "source": ["aws.states"], "detailType": ["Step Functions Execution Status Change"], "detail": { "status": ["SUCCEEDED", "FAILED", "TIMED_OUT", "ABORTED"] } }
EventBridgeに通知される内容を引用しておきます。これは成功時のものです。
{ "version": "0", "id": "315c1398-40ff-a850-213b-158f73e60175", "detail-type": "Step Functions Execution Status Change", "source": "aws.states", "account": "012345678912", "time": "2019-02-26T19:42:21Z", "region": "us-east-1", "resources": [ "arn:aws:states:us-east-1:012345678912:execution:state-machine-name:execution-name" ], "detail": { "executionArn": "arn:aws:states:us-east-1:012345678912:execution:state-machine-name:execution-name", "stateMachineArn": "arn:aws:states:us-east-1:012345678912:stateMachine:state-machine", "name": "execution-name", "status": "SUCCEEDED", "startDate": 1547148840101, "stopDate": 1547148840122, "input": "{}", "inputDetails": { "included": true }, "output": "\"Hello World!\"", "outputDetails": { "included": true } } }
Step Functions 実行ステータス変更用 EventBridge (CloudWatch Events) - AWS Step Functions
あとは検証に使用する適当なステートマシンを用意します。今回はマネジメントコンソールからデフォルトで用意されているHello Worldのステートマシンを作成しました。
それではこのステートマシンを実行し、Slackへ通知された内容を確認してみます。
うーん、ちょっと情報量が少ないですね……。成功か失敗かもわかりませんし、詳細を確認するリンクも欲しいところです。
入力トランスフォーマーを使用して通知内容をカスタマイズする
デフォルトの通知内容では情報量が少ないため、EventBridgeの入力トランスフォーマーを使用して、通知内容をカスタマイズしてみましょう。
マネジメントコンソールのEventBridgeのページで、[ルールを編集]→[ターゲットを選択]→[入力の設定]と移動します。
入力トランスフォーマーは 入力パス と 入力テンプレート に分かれています。入力パスでは入力テンプレートで使用したい変数を定義します。実際に渡される内容は入力テンプレートに定義します。今回はそれぞれ次のように定義しました。
こちらは入力パス。EventBridgeに渡される値からJSONパスを使って変数を定義しています。
{ "account": "$.account", "detail-executionArn": "$.detail.executionArn", "detail-input": "$.detail.input", "detail-name": "$.detail.name", "detail-status": "$.detail.status", "detail-type": "$.detail-type", "id": "$.id", "region": "$.region", "source": "$.source", "time": "$.time", "version": "$.version" }
続いて入力テンプレート。ほとんどが再定義しているだけですが、detail-type
とresources
を変えています。試行錯誤してみたところ、detail
以外のフィールドは削ってはダメなようです。
{ "version": <version>, "id": <id>, "detail-type": "[<detail-status>] <detail-type>", "source": <source>, "account": <account>, "time": <time>, "region": <region>, "resources": [ "https://<region>.console.aws.amazon.com/states/home?region=<region>#/executions/details/<detail-executionArn>",<detail-input> ] }
これらを定義したうえでもう一度ステートマシンを実行してみます。通知された内容は次のもの。
SUCCEEDED
とステータスがわかります。また詳細を確認するためのリンクもきちんと通知されていますね。どうやらdetail-type
が通知のタイトルに、resources
の内容がリストとして表示されるようです。これを元にすれば通知に出したい内容(今回はリンクと入力パラメーター)を好きにカスタマイズできそうですね。
まとめ
Step Functionsの実行完了をSlackに通知させてみました。デフォルトの内容では少々物足りないものでしたが、入力トランスフォーマーを使用すればカバーできそうです。
ちなみにタイトル部分をマネジメントコンソールのリンクにしようとしてみましたが、こちらは断念しました。成功した方はやり方を教えてください。